Term 2023 Fall

Team members:

Abstract

From 1959 to 2017, music has changed immensely, whether it be jazz to rock to pop to edm. Time’s have changed and the billboards have too. This project will explore:

  • A songs grade to find the best song in the dataset
  • What types of songs are there? what modes or key modes do they use?
  • How loud are these songs and what does it have to do with other factors?
  • Comparisons between variables to other variables to find any correlations?
  • Which artist had the most songs in the top hits?
  • As well as trend patterns from years to years

With these explorations, we should be able to get a good narrative on the shifts in music over the past six decades.

We will be using the data available at: all_billboard_summer_hits.csv

Introduction

The musical landscape has undergone transformations over the decades, with Billboard hits acting as a time capsule reflecting the evolving tastes and trends of society. In this exploration, we delve into the rich history of Billboard chart-toppers spanning from 1958 to 2017. By looking at key musical characteristics such as danceability, energy, and acousticness, we aim to uncover nuanced patterns, trends, and the ever-shifting dynamics of popular music. Through visualizations and analyses, we plan to provide a comprehensive overview of how these musical elements have shaped and been shaped by cultural shifts, technological advancements, and the ever-changing musical landscape over the past six decades.

Prerequisites

Loading the packages needed

library(tidyverse)
library(ggplot2)
library(dplyr)
library(plotly)

Dataset

Importing the data set from Github, which can be found here.

url <- "https://raw.githubusercontent.com/SilShizukesa/final_project_ds/master/data/all_billboard_summer_hits.csv"
all_billboard_summer_hits <- read_csv(url)
Rows: 600 Columns: 22── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (10): key, mode, track_uri, key_mode, playlist_name, playlist_img, track_name, artist_name, album_name, album_img
dbl (12): danceability, energy, loudness, speechiness, acousticness, instrumentalness, liveness, valence, tempo, duration_ms, time_signature, year
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

For our report, let us take a quick peak at our dataset:

all_billboard_summer_hits

Data Exploration

If we want to explore our dataset, we’ll need to get a good feel for the entries in it as well as some key details for each observation. Let’s summarise the dataset and see what the variables are:

summary(all_billboard_summer_hits)
  danceability        energy           key               loudness           mode            speechiness       acousticness       instrumentalness       liveness          valence           tempo         track_uri        
 Min.   :0.2170   Min.   :0.0600   Length:600         Min.   :-23.574   Length:600         Min.   :0.02330   Min.   :0.0000488   Min.   :0.0000000   Min.   :0.02480   Min.   :0.0695   Min.   : 62.83   Length:600        
 1st Qu.:0.5457   1st Qu.:0.4768   Class :character   1st Qu.:-10.947   Class :character   1st Qu.:0.03280   1st Qu.:0.0417250   1st Qu.:0.0000000   1st Qu.:0.08595   1st Qu.:0.4790   1st Qu.:100.22   Class :character  
 Median :0.6480   Median :0.6405   Mode  :character   Median : -8.072   Mode  :character   Median :0.04140   Median :0.1620000   Median :0.0000032   Median :0.12400   Median :0.6900   Median :120.01   Mode  :character  
 Mean   :0.6407   Mean   :0.6221                      Mean   : -8.587                      Mean   :0.06866   Mean   :0.2665156   Mean   :0.0364316   Mean   :0.17979   Mean   :0.6488   Mean   :120.48                     
 3rd Qu.:0.7402   3rd Qu.:0.7830                      3rd Qu.: -5.862                      3rd Qu.:0.06990   3rd Qu.:0.4472500   3rd Qu.:0.0007132   3rd Qu.:0.22275   3rd Qu.:0.8482   3rd Qu.:133.84                     
 Max.   :0.9800   Max.   :0.9890                      Max.   : -1.097                      Max.   :0.51700   Max.   :0.9870000   Max.   :0.9540000   Max.   :0.98900   Max.   :0.9860   Max.   :210.75                     
  duration_ms     time_signature    key_mode         playlist_name      playlist_img        track_name        artist_name         album_name         album_img              year     
 Min.   :103386   Min.   :3.000   Length:600         Length:600         Length:600         Length:600         Length:600         Length:600         Length:600         Min.   :1958  
 1st Qu.:192887   1st Qu.:4.000   Class :character   Class :character   Class :character   Class :character   Class :character   Class :character   Class :character   1st Qu.:1973  
 Median :226926   Median :4.000   Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character   Mode  :character   Median :1988  
 Mean   :229434   Mean   :3.972                                                                                                                                        Mean   :1988  
 3rd Qu.:257854   3rd Qu.:4.000                                                                                                                                        3rd Qu.:2002  
 Max.   :557293   Max.   :5.000                                                                                                                                        Max.   :2017  

Here are a few samples to show what a data entry looks like:

sample_n(all_billboard_summer_hits, 5)

What is the best Summer Billboard Hit?

This question can seem to be a loaded question, and truthfully very opionated. But we can take some key factors into consideration to decide factually what is the best song?

*Taking the key factors into consideration, giving a weight to each factor then gives us the chance to multiply it by its respective data point and figure out its overall score once added

*Once the score has been calculated, all that must be done is put everything into the original table and select the data points we only want to see

*Finally, once the scores are calculated and given, we then will give each score a “Grade” based on this scale: #1 song = The Overall Best Song 70+ = “S Tier” 60-69 = “A Tier” 50-59 = “B Tier” 40-49 = “C Tier” 39 and below = “D Tier”

songs_data <- all_billboard_summer_hits

weights <- c(danceability = .3, 
             liveness = .02, 
             energy = .3, 
             valence = .3, 
             acousticness = .02, 
             speechiness = .04, 
             instrumentalness = .02)

all_billboard_summer_hits %>%
  mutate(score = rowSums(songs_data[, names(weights)] * weights)) %>%
  select(track_name, artist_name, score, year,  danceability, liveness, energy, valence, acousticness, speechiness, instrumentalness) %>%
  arrange(desc(score))
NA
NA

This is our function!

grade <- function(score) {
  if (score >= .7287) {
    return("The Overall Best Song")
  } else if (score >= .70 & score <= .72701942) {
    return("S Tier")
  } else if (score >= .60 & score <= .70) {
    return("A Tier")
  } else if (score >= .50 & score <= .60) {
    return("B Tier")
  } else if (score >= .40 & score <= .50) {
    return("C Tier")
  } else if (score < .07) {
    return("Worst Song in the Summer Billboard Hits")
  } else {
    return("D Tier")
  }
}

Lets use our brand new function to find the grades for each songs score:



# Function to calculate grade
grade <- function(score) {
  if (score >= .7287) {
    return("The Overall Best Song")
  } else if (score >= .70 & score <= .72701942) {
    return("S Tier")
  } else if (score >= .60 & score <= .70) {
    return("A Tier")
  } else if (score >= .50 & score <= .60) {
    return("B Tier")
  } else if (score >= .40 & score <= .50) {
    return("C Tier")
  } else if (score < .07) {
    return("Worst Song in the Summer Billboard Hits")
  } else {
    return("D Tier")
  }
}

# Apply the grade function to the dataset
result_table <- all_billboard_summer_hits %>%
  mutate(score = rowSums(across(names(weights)) * weights),
         grade = sapply(score, grade)) %>%
  select(track_name, artist_name, score, grade, year,  danceability, liveness, energy, valence, acousticness, speechiness, instrumentalness) %>%
  arrange(desc(score))

# View the result table
print(result_table)
NA

With this data exploration, we have now made a formula that will find us the best overall song in the billboard summer hits dataset that is without any opinionated input. It is all solely based on data given to use in numerical observations of songs danceability, valence, acousticeness, energy, and other factors.

Given this output, the best song on this list is: Electric Avennue by Eddie Grant made in 1983 with a score of .72871144

what else can we find about this song that makes it “the best”?

all_billboard_summer_hits$duration_minutes <- all_billboard_summer_hits$duration_ms / (1000 * 60)

all_billboard_summer_hits %>%
  filter(track_name == "Electric Avennue") %>%
  select(duration_minutes, track_name, danceability, valence, energy, everything())

we can see that this song is 3.2 minutes long, as well as having a very high danceability score. However, the energy seems to be a be low the reason for it being the best overall song is the fact that its valence is right up there with danceability in being so high. And after seeing the scores for its other variables, it can be confirmed as to why Electric Avennue is the overall best song.

Data comparisons

In this section we want to look at these hits as a whole. Are there any trends we can spot?

Nominal Data

The first data type we looked at was if a song was in major or minor.

ggplot(data = all_billboard_summer_hits, aes(x = mode, fill = mode)) +
  geom_bar(stat = "count", show.legend = FALSE, color = "black", alpha = 0.8) +
  geom_text(stat = "count", aes(label = after_stat(count)), vjust = -0.5) +
  labs(title = "Distribution of Mode",
       x = element_blank(),
       y = element_blank()) +
  scale_fill_manual(values = c("#56B4E9", "#E69F00")) +
  theme_minimal() + 
  theme(axis.text.y = element_blank(),
        axis.ticks = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        plot.title = element_text(hjust = 0.5))

Now that we can see that the majority of songs are in the major mode. We didn’t feel like it was enough and wanted to know the amount of each different key modes of all the songs over the years.

Therefore, we will find the specific counts of each key mode in this graph:

library(dplyr)

all_billboard_summer_hits %>%
  count(key_mode, mode) %>%
  ggplot(aes(x = reorder(key_mode, n), y = n, fill = mode)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = n), vjust = 0.5, hjust = 1) +
  labs(title = "Distribution of Key Mode",
       x = "Key Mode",
       y = element_blank()) +
  scale_fill_manual(values = c("#66c2a5", "#fc8d62"), name = "Mode") +
  theme_minimal() + 
  coord_flip() +
  theme(axis.text.x = element_blank(),
        axis.ticks = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        plot.title = element_text(hjust = 0.5))

And after a quick look, we can see that most songs have used C major in the billboard summer hits. Maybe this means C major is the best key mode for making the top billboard summer hits?

The table below is just to show some songs that are in the C major key mode:

all_billboard_summer_hits %>%
  filter(key_mode == "C major") %>%
  select(key_mode, track_name, everything())

Loudness

Let’s take a look at the Loudness scale:

dis_loud <- ggplot(data = all_billboard_summer_hits, aes(x = loudness)) +
  geom_histogram(binwidth = .5, fill = "#3498db", color ="#2c3e50", alpha = .5) +
  labs(title = "Distribution of Loudness",
     x = "Loudness",
     y = "Frequency") +
  theme_minimal()
ggplotly(dis_loud)

Here we can see that the majority of songs lay between -10 Db and -5 Db, as well as the data having a left skew. We wanted to make a very simple and easy graph to look at for the loudness scale, making it interactive with plotly allows for users to hover over the bars to see the individual counts for each loudness scale integer. With the highest being 42 songs at a decibel level of -6.

Now let us take a look at loudness compared with other variables:

First up is loudness compared to liveness

loud_v_live <- ggplot(data = all_billboard_summer_hits, aes(x = liveness, y = loudness)) +
  geom_point(alpha = 0.7, size = 3, color = "#3498db") +
  geom_smooth(method = "lm", color = "#2c3e50", linetype = "dashed") +
  labs(title = "Loudness vs Liveness",
       x = "Liveness",
       y = "Loudness") +
  theme_minimal()
ggplotly(loud_v_live)
`geom_smooth()` using formula = 'y ~ x'

This graph shows that there is no relationship between liveliness and loudness. Though, it is important to note that most songs only have a slight live element to them. This is probably the outcome of songs being recorded in recording studios as opposed to live performances.

all_billboard_summer_hits %>%
  select(liveness, loudness, track_name)
ggplot(data = all_billboard_summer_hits, aes(x = energy, y = loudness)) +
  geom_point(alpha = 0.7, size = 3, color = "#3498db") +
  geom_smooth(method = "lm",color = "#2c3e50", linetype = "dashed") +
  labs(title = "Loudness vs Energy",
       x = "Energy",
       y = "Loudness") +
  theme_minimal() +
  theme(legend.position = "top")

Energy and loudness have a favorable correlation with one another. This finding supports our earlier theories that suggested that energy levels would increase with music volume.

all_billboard_summer_hits %>%
  select(energy, loudness,  track_name)

Danceability

Next let’s take a look at the danceability scale:

ggplot(data = all_billboard_summer_hits, aes(x = danceability)) +
  geom_histogram(binwidth = .05, fill = "#8e44ad", color = "#008080", alpha = .5) +
  labs(title = "Distribution of Danceability",
     x = "Danceability",
     y = "Frequency") +
  theme_minimal()

The song distribution is skewed slightly to the left and follows a standard bell shape. This demonstrates that most of these singles are at least somewhat danceable.

Next let us take a look at danceability compared with other variables:

First we will take a look at Energy compared to Danceability:

ggplot(data = all_billboard_summer_hits, aes(x = danceability, y = energy)) +
  geom_point(alpha = 0.5, size = 3, color = "#8e44ad") +  # Adjusted point aesthetics
  geom_smooth(method = "lm", color = "#008080", linetype = "dashed") +
  labs(title = "Danceability vs Energy",
       x = "Danceability",
       y = "Energy") +
  theme_minimal()

There is a small correlation between energy and danceability. Though we can see the best range for a song’s danceability is from .5 to .75.

all_billboard_summer_hits %>%
  select(energy, danceability, track_name)

Will we see the same thing with tempo?

ggplot(data = all_billboard_summer_hits, aes(x = danceability, y = tempo)) +
  geom_point(alpha = 0.5, size = 3, color = "#8e44ad") +
  geom_smooth(method = "lm", color = "#008080", linetype = "dashed") +
  labs(title = "Danceability vs Tempo",
       x = "Danceability",
       y = "Tempo") +
  theme_minimal()

A song’s danceability can be viewed as a function of its tempo; this graph indicates that a tempo of between 150 and 100 is ideal.

all_billboard_summer_hits %>%
  select(tempo, danceability, track_name)

Valence

To what extent are songs happy? Let us examine the following pair of graphs:

ggplot(data = all_billboard_summer_hits, aes(x = "", y = valence)) +
  geom_boxplot(fill = "#2ecc71", color = "#e67e22", alpha = 0.2) +
  labs(title = "Boxplot of Valence",
       y = "Valence") +
  coord_flip() +
  theme_minimal() +
  theme(
    axis.title.y = element_blank())

ggplot(data = all_billboard_summer_hits, aes(x = valence)) +
  geom_histogram(binwidth = .05, fill = "#2ecc71", color = "#e67e22", alpha = .2) +
  labs(title = "Distribution of Valence",
     x = "Valence",
     y = "Frequency") +
  theme_minimal()

According to these graphs, happiness has a significant leftward skew, which indicates that the majority of songs that become hits will sound happy.
Let’s now examine an energy and valence scatter plot:

ggplot(data = all_billboard_summer_hits, aes(x = valence, y = energy )) +
  geom_point(alpha = 0.2, size = 3, color = "#2ecc71") +
  geom_smooth(method = "lm", color = "#e67e22", linetype = "dashed") +
  labs(title = "Valence vs Energy",
       x = "Valence",
       y = "Energy") +
  theme_minimal()

In any event, I don’t think this is all that surprising. It appeared evident that happiness and energy were positively correlated.

all_billboard_summer_hits %>%
  select(energy, valence, track_name)

Artist insight

We want to examine the artist with the greatest hits in this section and compare them to their contemporaries. Does said artist adhere to the established trends? Or are they going to overlook them?

Exploration

What artist has the most summer hits?

all_billboard_summer_hits %>% 
  group_by(artist_name) %>% 
  summarise(count = n()) %>% 
  arrange(desc(count)) %>% 
  slice_head(n = 1)
NA

With seven entries on the list, Rihanna defeated every other artist to take the top spot. Which songs were these?

rihanna_songs <- all_billboard_summer_hits %>% 
  filter(artist_name == "Rihanna")

rihanna_songs %>% 
select(track_name, year)

The list of songs is visible above. We have listed the songs below along with every characteristic that has been linked to them.

rihanna_songs

Rihanna Nominal Graphs

As in the prior sections, let’s start by examining Rihanna’s nominal statistics:

ggplot(data = rihanna_songs) +
  geom_bar(aes(x = mode, fill = mode), color = "black", alpha = 0.8, stat = "count") +
  labs(title = "Distribution of Modes in Rihanna's Songs") +
  scale_fill_manual(values = c("#3498db", "#e74c3c")) +
  theme_minimal() +
  theme(
  legend.position = "none",
  axis.title.y = element_blank(),
  axis.title.x = element_blank())

With a higher average of songs in a minor mode, Rihanna beats the mean with a ratio of 4:3.

Rihanna Comparisons

Let us take a quick look at Rihanna’s placements in some of our previous graphs. How will she compare?

ggplot(data = all_billboard_summer_hits, aes(x = danceability, y = tempo)) +
  geom_point(alpha = 0.7, size = 3, color = "#3498db") +
  geom_smooth(method = "lm", color = "#e74c3c", linetype = "dashed") +
  
  #add rihannas songs
  geom_point(data = rihanna_songs, aes(x = danceability, y = tempo), alpha = 1, size = 3, color = "#2ecc71") +
  
  labs(title = "Danceability vs Tempo",
       x = "Danceability",
       y = "Tempo") +
  theme_minimal()

ggplot(data = all_billboard_summer_hits, aes(x = liveness, y = loudness)) +
  geom_point(alpha = 0.7, size = 3, color = "#3498db") +
  geom_smooth(method = "lm", color = "#e74c3c", linetype = "dashed") +
  
  # Add Rihanna's songs
  geom_point(data = rihanna_songs, aes(x = liveness, y = loudness), alpha = 1, size = 3, color = "#2ecc71") +
  
  labs(title = "loudness vs Liveness",
       x = "Liveness",
       y = "Loudness") +
  theme_minimal() +
  theme(legend.position = "top")

ggplot(data = all_billboard_summer_hits, aes(x = valence, y = energy)) +
  geom_point(alpha = 0.7, size = 3, color = "#3498db") +
  geom_smooth(method = "lm", color = "#e74c3c", linetype = "dashed") +
  
  # Add Rihanna's songs
  geom_point(data = rihanna_songs, aes(x = valence, y = energy), alpha = 1, size = 3, color = "#2ecc71") +
  
  labs(title = "Valence vs Energy",
       x = "Valence",
       y = "Energy") +
  theme_minimal() +
  theme(legend.position = "top")

Rihanna’s music has above-average danceability and a dynamic touch thanks to its varying tempo. Her studio-centric style, which is positioned on the far left for liveliness, is in line with that of other artists. Her songs are notable for their constant emphasis on volume, which has a striking and captivating effect. Rihanna’s music explores a range of energy levels while keeping a central valence, making for a varied and captivating listening experience.

As we have shown Rihanna makes unique music compared to music as a whole. But, lets see if she gets closer to the mean when we look at her songs per year:

specific_years <- c(2005, 2006, 2007, 2008, 2012, 2016) # Years that Rihanna charted

filtered_data <- all_billboard_summer_hits %>%
  filter(year %in% specific_years)

ggplot(data = filtered_data, aes(x = danceability, y = tempo)) +
  geom_point(aes(color = "Other"), alpha = 0.7, size = 3) +
  geom_smooth(method = "lm", color = "#e74c3c", linetype = "dashed") +
  
  geom_point(data = rihanna_songs, aes(color = "Rihanna"), alpha = 1, size = 3) +
  
  labs(title = "Danceability and Tempo",
       x = "Danceability",
       y = "Tempo") +
  
  scale_color_manual(values = c("Other" = "#3498db", "Rihanna" = "#2ecc71"), name = "Legend") +
  
  theme_minimal() +
  theme(legend.position = "top") +
  
  # Facet by year
  facet_wrap(~ year, scales = "free")

specific_years <- c(2005, 2006, 2007, 2008, 2012, 2016) # Years that Rihanna charted

filtered_data <- all_billboard_summer_hits %>%
  filter(year %in% specific_years)

ggplot(data = filtered_data, aes(x = liveness, y = loudness)) +
  geom_point(aes(color = "Other"), alpha = 0.7, size = 3) +
  geom_smooth(method = "lm", color = "#e74c3c", linetype = "dashed") +
  
  geom_point(data = rihanna_songs, aes(color = "Rihanna"), alpha = 1, size = 3) +
  
  labs(title = "Loudness vs Liveness",
       x = "Liveness",
       y = "Loudness") +
  
  scale_color_manual(values = c("Other" = "#3498db", "Rihanna" = "#2ecc71"), name = "Legend") +
  
  theme_minimal() +
  theme(legend.position = "top") +
  
  # Facet by year
  facet_wrap(~ year, scales = "free")

specific_years <- c(2005, 2006, 2007, 2008, 2012, 2016) # Years that Rihanna charted

filtered_data <- all_billboard_summer_hits %>%
  filter(year %in% specific_years)

ggplot(data = filtered_data, aes(x = valence, y = energy)) +
  geom_point(aes(color = "Other"), alpha = 0.7, size = 3) +
  geom_smooth(method = "lm", color = "#e74c3c", linetype = "dashed") +
  
  geom_point(data = rihanna_songs, aes(color = "Rihanna"), alpha = 1, size = 3) +
  
  labs(title = "Valence vs Energy",
       x = "Valence",
       y = "Energy") +
  
  scale_color_manual(values = c("Other" = "#3498db", "Rihanna" = "#2ecc71"), name = "Legend") +
  
  theme_minimal() +
  theme(legend.position = "top") +
  
  # Facet by year
  facet_wrap(~ year, scales = "free")

These graphs demonstrate that Rihanna is, in fact, exceptional. Her songs are typically found on the edge of the uncertainty cone, but there is room for uncertainty with only 10 samples. Her music did seem to deviate the most from the mean in 2007, and was the closest in 2008 & 2012.

Summary

Rihanna’s incredible musical ability, which combines dynamic tempo changes and above-average danceability, fits in with other artists in a studio-centric liveliness. Her songs stand out for emphasizing loudness, which produces an arresting and alluring effect. Although there is some uncertainty due to the small 10-sample size, the graphs show that her music regularly falls on the edge of the uncertainty cone. While her music came very close to the mean in 2008 and 2012, there were some notable departures from the mean in 2007. This combination highlights Rihanna’s interesting and varied career in music, both stylistically and numerically.

For Future Consideration

Does length of song correlate to danceability scores?

df <- all_billboard_summer_hits %>%
  select(danceability, duration_ms, track_name, artist_name) %>%
  arrange(desc(duration_ms))

df$duration_minutes <- df$duration_ms / (1000 * 60)

df %>%
  select(danceability, duration_minutes, track_name, artist_name)
NA
NA
NA

In the end, we very briefly looked into what some correlations could be between the length of songs and their danceability score. As we can see above in the table, the longest song (in minutes) is “I want your sex Pts 1 and 2 remastered” by George Michaels with a danceability score of .812. But right below it is an 8.95 minute long song with a score of .217. Which to us, makes a lot of sense, if a song is very long then you wouldn’t want to dance for too long but then it seems like there could be outliers to this. We wanted to leave this for the end for future consideration to take it further when we are more proficient than we are with R to find out more about this detail.

Conclusion

In conclusion, our investigation has explored the dynamic environment of Billboard successes between 1959 and 2017, revealing notable changes in musical styles and traits. We created a formula to objectively identify the greatest song overall in the Billboard summer hits dataset by using a thorough analysis. This formula took into account important parameters like danceability, liveness, energy, and more. We developed a grading system that assigns songs to tiers based on our meticulous study and balancing of these elements, offering an objective evaluation of their general quality. Analyzing nominal data exposed interesting trends, like the dominance of C major key mode and the frequency of songs in the major mode. We also looked into valence, loudness, and danceability, finding patterns and insights into the connections between these musical components. Additional artist-specific research, with a special focus on Rihanna, highlighted her unique musical qualities and the diversity and originality seen in the larger dataset. All things considered, our study provides a thorough examination of the musical landscape over the course of six decades, providing insightful information about the elements that lead to the popularity of Billboard summer successes.

Glossary

Danceability: A measure of how suitable a track is for dancing based on factors like tempo, rhythm stability, beat strength, and overall regularity.

Energy: Represents the intensity and activity level of a song. High energy songs might be more lively and dynamic, while low energy songs may be more calm and subdued.

Key: Indicates the key signature of the song, representing the tonal center or home base of the music.

Loudness: Refers to the volume of the song. It’s usually measured in decibels (dB). Higher values indicate louder songs.

Mode: Describes the modality of the music, i.e., whether it’s in a major or minor key. Major keys often sound more uplifting, while minor keys can give a more melancholic feel.

Speechiness: Measures the presence of spoken words in a track. Songs with higher speechiness values may contain more spoken words than singing.

Acousticness: Indicates the likelihood that a track is acoustic, meaning it doesn’t heavily rely on electronic or synthesized elements.

Instrumentalness: Measures the likelihood that a track is instrumental, without vocal content.

Liveness: Indicates the presence of an audience in the recording. A higher value suggests the track was likely recorded live.

Valence: Describes the musical positiveness of a track. Higher valence values suggest a more positive, happy, or cheerful mood.

Tempo: Represents the speed or pace of a song, typically measured in beats per minute (BPM).

Duration_ms: The duration of the song in milliseconds.

Time Signature: Describes the number of beats in a bar and which note value gets the beat.

Key Mode: A combination of key and mode, indicating both the tonal center and the modality of the music.

LS0tCnRpdGxlOiAiRXhwbG9yaW5nIE11c2ljIFRocm91Z2ggVGhlIFllYXJzIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6IHllcwogICAgdG9jX2RlcHRoOiAyCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICB0b2NfZGVwdGg6ICcyJwogICAgZGZfcHJpbnQ6IHBhZ2VkCmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCgoqKlRlcm0gMjAyMyBGYWxsKioKClRlYW0gbWVtYmVyczoKCi0gICBTdHVkZW50IDE6IFtOb2FoIFZhbnNjb3lvY10obm9haC52YW5zY295b2NAZ21haWwuY29tKQotICAgU3R1ZGVudCAyOiBbQnJhbmRvbiBDb25uZWxsXShiY29ubmVsbDc3MzBAZmxvcmlkYXBvbHkuZWR1KQoKKipBYnN0cmFjdCoqCgpGcm9tIDE5NTkgdG8gMjAxNywgbXVzaWMgaGFzIGNoYW5nZWQgaW1tZW5zZWx5LCB3aGV0aGVyIGl0IGJlIGphenogdG8gcm9jayB0byBwb3AgdG8gZWRtLiBUaW1lJ3MgaGF2ZSBjaGFuZ2VkIGFuZCB0aGUgYmlsbGJvYXJkcyBoYXZlIHRvby4gVGhpcyBwcm9qZWN0IHdpbGwgZXhwbG9yZToKCiAgKiBBIHNvbmdzIGdyYWRlIHRvIGZpbmQgdGhlIGJlc3Qgc29uZyBpbiB0aGUgZGF0YXNldAogICogV2hhdCB0eXBlcyBvZiBzb25ncyBhcmUgdGhlcmU/IHdoYXQgbW9kZXMgb3Iga2V5IG1vZGVzIGRvIHRoZXkgdXNlPwogICogSG93IGxvdWQgYXJlIHRoZXNlIHNvbmdzIGFuZCB3aGF0IGRvZXMgaXQgaGF2ZSB0byBkbyB3aXRoIG90aGVyIGZhY3RvcnM/CiAgKiBDb21wYXJpc29ucyBiZXR3ZWVuIHZhcmlhYmxlcyB0byBvdGhlciB2YXJpYWJsZXMgdG8gZmluZCBhbnkgY29ycmVsYXRpb25zPwogICogV2hpY2ggYXJ0aXN0IGhhZCB0aGUgbW9zdCBzb25ncyBpbiB0aGUgdG9wIGhpdHM/CiAgKiBBcyB3ZWxsIGFzIHRyZW5kIHBhdHRlcm5zIGZyb20geWVhcnMgdG8geWVhcnMKCldpdGggdGhlc2UgZXhwbG9yYXRpb25zLCB3ZSBzaG91bGQgYmUgYWJsZSB0byBnZXQgYSBnb29kIG5hcnJhdGl2ZSBvbiB0aGUgc2hpZnRzIGluIG11c2ljIG92ZXIgdGhlIHBhc3Qgc2l4IGRlY2FkZXMuCgpXZSB3aWxsIGJlIHVzaW5nIHRoZSBkYXRhIGF2YWlsYWJsZSBhdDogYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cy5jc3YKCiMgSW50cm9kdWN0aW9uCgpUaGUgbXVzaWNhbCBsYW5kc2NhcGUgaGFzIHVuZGVyZ29uZSB0cmFuc2Zvcm1hdGlvbnMgb3ZlciB0aGUgZGVjYWRlcywgd2l0aCBCaWxsYm9hcmQgaGl0cyBhY3RpbmcgYXMgYSB0aW1lIGNhcHN1bGUgcmVmbGVjdGluZyB0aGUgZXZvbHZpbmcgdGFzdGVzIGFuZCB0cmVuZHMgb2Ygc29jaWV0eS4gSW4gdGhpcyBleHBsb3JhdGlvbiwgd2UgZGVsdmUgaW50byB0aGUgcmljaCBoaXN0b3J5IG9mIEJpbGxib2FyZCBjaGFydC10b3BwZXJzIHNwYW5uaW5nIGZyb20gMTk1OCB0byAyMDE3LiBCeSBsb29raW5nIGF0IGtleSBtdXNpY2FsIGNoYXJhY3RlcmlzdGljcyBzdWNoIGFzIGRhbmNlYWJpbGl0eSwgZW5lcmd5LCBhbmQgYWNvdXN0aWNuZXNzLCB3ZSBhaW0gdG8gdW5jb3ZlciBudWFuY2VkIHBhdHRlcm5zLCB0cmVuZHMsIGFuZCB0aGUgZXZlci1zaGlmdGluZyBkeW5hbWljcyBvZiBwb3B1bGFyIG11c2ljLiBUaHJvdWdoIHZpc3VhbGl6YXRpb25zIGFuZCBhbmFseXNlcywgd2UgcGxhbiB0byBwcm92aWRlIGEgY29tcHJlaGVuc2l2ZSBvdmVydmlldyBvZiBob3cgdGhlc2UgbXVzaWNhbCBlbGVtZW50cyBoYXZlIHNoYXBlZCBhbmQgYmVlbiBzaGFwZWQgYnkgY3VsdHVyYWwgc2hpZnRzLCB0ZWNobm9sb2dpY2FsIGFkdmFuY2VtZW50cywgYW5kIHRoZSBldmVyLWNoYW5naW5nIG11c2ljYWwgbGFuZHNjYXBlIG92ZXIgdGhlIHBhc3Qgc2l4IGRlY2FkZXMuCgojIFByZXJlcXVpc2l0ZXMKCkxvYWRpbmcgdGhlIHBhY2thZ2VzIG5lZWRlZAoKYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocGxvdGx5KQpgYGAKCiMgRGF0YXNldAoKSW1wb3J0aW5nIHRoZSBkYXRhIHNldCBmcm9tIEdpdGh1Yiwgd2hpY2ggY2FuIGJlIGZvdW5kIFtoZXJlXShodHRwczovL2dpdGh1Yi5jb20vcmVpc2FuYXIvZGF0YXNldHMvYmxvYi9tYXN0ZXIvYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cy5jc3YpLgoKYGBge3J9CnVybCA8LSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1NpbFNoaXp1a2VzYS9maW5hbF9wcm9qZWN0X2RzL21hc3Rlci9kYXRhL2FsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMuY3N2IgphbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzIDwtIHJlYWRfY3N2KHVybCkKYGBgCkZvciBvdXIgcmVwb3J0LCBsZXQgdXMgdGFrZSBhIHF1aWNrIHBlYWsgYXQgb3VyIGRhdGFzZXQ6CgpgYGB7cn0KYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cwpgYGAKCiMgRGF0YSBFeHBsb3JhdGlvbgoKSWYgd2Ugd2FudCB0byBleHBsb3JlIG91ciBkYXRhc2V0LCB3ZSdsbCBuZWVkIHRvIGdldCBhIGdvb2QgZmVlbCBmb3IgdGhlIGVudHJpZXMgaW4gaXQgYXMgd2VsbCBhcyBzb21lIGtleSBkZXRhaWxzIGZvciBlYWNoIG9ic2VydmF0aW9uLiBMZXQncyBzdW1tYXJpc2UgdGhlIGRhdGFzZXQgYW5kIHNlZSB3aGF0IHRoZSB2YXJpYWJsZXMgYXJlOgoKYGBge3J9CnN1bW1hcnkoYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cykKYGBgCgpIZXJlIGFyZSBhIGZldyBzYW1wbGVzIHRvIHNob3cgd2hhdCBhIGRhdGEgZW50cnkgbG9va3MgbGlrZToKCmBgYHtyfQpzYW1wbGVfbihhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzLCA1KQpgYGAKIyBXaGF0IGlzIHRoZSBiZXN0IFN1bW1lciBCaWxsYm9hcmQgSGl0PwoKVGhpcyBxdWVzdGlvbiBjYW4gc2VlbSB0byBiZSBhIGxvYWRlZCBxdWVzdGlvbiwgYW5kIHRydXRoZnVsbHkgdmVyeSBvcGlvbmF0ZWQuIEJ1dCB3ZSBjYW4gdGFrZSBzb21lIGtleSBmYWN0b3JzIGludG8gY29uc2lkZXJhdGlvbiB0byBkZWNpZGUgZmFjdHVhbGx5IHdoYXQgaXMgdGhlIGJlc3Qgc29uZz8KCiAgKlRha2luZyB0aGUga2V5IGZhY3RvcnMgaW50byBjb25zaWRlcmF0aW9uLCBnaXZpbmcgYSB3ZWlnaHQgdG8gZWFjaCBmYWN0b3IgdGhlbiBnaXZlcyB1cyB0aGUgY2hhbmNlIHRvIG11bHRpcGx5IGl0IGJ5IGl0cyByZXNwZWN0aXZlIGRhdGEgcG9pbnQgYW5kIGZpZ3VyZSBvdXQgaXRzIG92ZXJhbGwgc2NvcmUgb25jZSBhZGRlZAogIAogICpPbmNlIHRoZSBzY29yZSBoYXMgYmVlbiBjYWxjdWxhdGVkLCBhbGwgdGhhdCBtdXN0IGJlIGRvbmUgaXMgcHV0IGV2ZXJ5dGhpbmcgaW50byB0aGUgb3JpZ2luYWwgdGFibGUgYW5kIHNlbGVjdCB0aGUgZGF0YSBwb2ludHMgd2Ugb25seSB3YW50IHRvIHNlZQogIAogICpGaW5hbGx5LCBvbmNlIHRoZSBzY29yZXMgYXJlIGNhbGN1bGF0ZWQgYW5kIGdpdmVuLCB3ZSB0aGVuIHdpbGwgZ2l2ZSBlYWNoIHNjb3JlIGEgIkdyYWRlIiBiYXNlZCBvbiB0aGlzIHNjYWxlOgogICMxIHNvbmcgPSBUaGUgT3ZlcmFsbCBCZXN0IFNvbmcKICA3MCsgPSAiUyBUaWVyIgogIDYwLTY5ID0gIkEgVGllciIKICA1MC01OSA9ICJCIFRpZXIiCiAgNDAtNDkgPSAiQyBUaWVyIgogIDM5IGFuZCBiZWxvdyA9ICJEIFRpZXIiCiAgCgpgYGB7cn0Kc29uZ3NfZGF0YSA8LSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzCgp3ZWlnaHRzIDwtIGMoZGFuY2VhYmlsaXR5ID0gLjMsIAogICAgICAgICAgICAgbGl2ZW5lc3MgPSAuMDIsIAogICAgICAgICAgICAgZW5lcmd5ID0gLjMsIAogICAgICAgICAgICAgdmFsZW5jZSA9IC4zLCAKICAgICAgICAgICAgIGFjb3VzdGljbmVzcyA9IC4wMiwgCiAgICAgICAgICAgICBzcGVlY2hpbmVzcyA9IC4wNCwgCiAgICAgICAgICAgICBpbnN0cnVtZW50YWxuZXNzID0gLjAyKQoKYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUKICBtdXRhdGUoc2NvcmUgPSByb3dTdW1zKHNvbmdzX2RhdGFbLCBuYW1lcyh3ZWlnaHRzKV0gKiB3ZWlnaHRzKSkgJT4lCiAgc2VsZWN0KHRyYWNrX25hbWUsIGFydGlzdF9uYW1lLCBzY29yZSwgeWVhciwgIGRhbmNlYWJpbGl0eSwgbGl2ZW5lc3MsIGVuZXJneSwgdmFsZW5jZSwgYWNvdXN0aWNuZXNzLCBzcGVlY2hpbmVzcywgaW5zdHJ1bWVudGFsbmVzcykgJT4lCiAgYXJyYW5nZShkZXNjKHNjb3JlKSkKCgpgYGAKVGhpcyBpcyBvdXIgZnVuY3Rpb24hCmBgYHtyfQpncmFkZSA8LSBmdW5jdGlvbihzY29yZSkgewogIGlmIChzY29yZSA+PSAuNzI4NykgewogICAgcmV0dXJuKCJUaGUgT3ZlcmFsbCBCZXN0IFNvbmciKQogIH0gZWxzZSBpZiAoc2NvcmUgPj0gLjcwICYgc2NvcmUgPD0gLjcyNzAxOTQyKSB7CiAgICByZXR1cm4oIlMgVGllciIpCiAgfSBlbHNlIGlmIChzY29yZSA+PSAuNjAgJiBzY29yZSA8PSAuNzApIHsKICAgIHJldHVybigiQSBUaWVyIikKICB9IGVsc2UgaWYgKHNjb3JlID49IC41MCAmIHNjb3JlIDw9IC42MCkgewogICAgcmV0dXJuKCJCIFRpZXIiKQogIH0gZWxzZSBpZiAoc2NvcmUgPj0gLjQwICYgc2NvcmUgPD0gLjUwKSB7CiAgICByZXR1cm4oIkMgVGllciIpCiAgfSBlbHNlIGlmIChzY29yZSA8IC4wNykgewogICAgcmV0dXJuKCJXb3JzdCBTb25nIGluIHRoZSBTdW1tZXIgQmlsbGJvYXJkIEhpdHMiKQogIH0gZWxzZSB7CiAgICByZXR1cm4oIkQgVGllciIpCiAgfQp9CgpgYGAKCkxldHMgdXNlIG91ciBicmFuZCBuZXcgZnVuY3Rpb24gdG8gZmluZCB0aGUgZ3JhZGVzIGZvciBlYWNoIHNvbmdzIHNjb3JlOgpgYGB7cn0KCgojIEZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBncmFkZQpncmFkZSA8LSBmdW5jdGlvbihzY29yZSkgewogIGlmIChzY29yZSA+PSAuNzI4NykgewogICAgcmV0dXJuKCJUaGUgT3ZlcmFsbCBCZXN0IFNvbmciKQogIH0gZWxzZSBpZiAoc2NvcmUgPj0gLjcwICYgc2NvcmUgPD0gLjcyNzAxOTQyKSB7CiAgICByZXR1cm4oIlMgVGllciIpCiAgfSBlbHNlIGlmIChzY29yZSA+PSAuNjAgJiBzY29yZSA8PSAuNzApIHsKICAgIHJldHVybigiQSBUaWVyIikKICB9IGVsc2UgaWYgKHNjb3JlID49IC41MCAmIHNjb3JlIDw9IC42MCkgewogICAgcmV0dXJuKCJCIFRpZXIiKQogIH0gZWxzZSBpZiAoc2NvcmUgPj0gLjQwICYgc2NvcmUgPD0gLjUwKSB7CiAgICByZXR1cm4oIkMgVGllciIpCiAgfSBlbHNlIGlmIChzY29yZSA8IC4wNykgewogICAgcmV0dXJuKCJXb3JzdCBTb25nIGluIHRoZSBTdW1tZXIgQmlsbGJvYXJkIEhpdHMiKQogIH0gZWxzZSB7CiAgICByZXR1cm4oIkQgVGllciIpCiAgfQp9CgojIEFwcGx5IHRoZSBncmFkZSBmdW5jdGlvbiB0byB0aGUgZGF0YXNldApyZXN1bHRfdGFibGUgPC0gYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUKICBtdXRhdGUoc2NvcmUgPSByb3dTdW1zKGFjcm9zcyhuYW1lcyh3ZWlnaHRzKSkgKiB3ZWlnaHRzKSwKICAgICAgICAgZ3JhZGUgPSBzYXBwbHkoc2NvcmUsIGdyYWRlKSkgJT4lCiAgc2VsZWN0KHRyYWNrX25hbWUsIGFydGlzdF9uYW1lLCBzY29yZSwgZ3JhZGUsIHllYXIsICBkYW5jZWFiaWxpdHksIGxpdmVuZXNzLCBlbmVyZ3ksIHZhbGVuY2UsIGFjb3VzdGljbmVzcywgc3BlZWNoaW5lc3MsIGluc3RydW1lbnRhbG5lc3MpICU+JQogIGFycmFuZ2UoZGVzYyhzY29yZSkpCgojIFZpZXcgdGhlIHJlc3VsdCB0YWJsZQpwcmludChyZXN1bHRfdGFibGUpCgpgYGAKV2l0aCB0aGlzIGRhdGEgZXhwbG9yYXRpb24sIHdlIGhhdmUgbm93IG1hZGUgYSBmb3JtdWxhIHRoYXQgd2lsbCBmaW5kIHVzIHRoZSBiZXN0IG92ZXJhbGwgc29uZyBpbiB0aGUgYmlsbGJvYXJkIHN1bW1lciBoaXRzIGRhdGFzZXQgdGhhdCBpcyB3aXRob3V0IGFueSBvcGluaW9uYXRlZCBpbnB1dC4gSXQgaXMgYWxsIHNvbGVseSBiYXNlZCBvbiBkYXRhIGdpdmVuIHRvIHVzZSBpbiBudW1lcmljYWwgb2JzZXJ2YXRpb25zIG9mIHNvbmdzIGRhbmNlYWJpbGl0eSwgdmFsZW5jZSwgYWNvdXN0aWNlbmVzcywgZW5lcmd5LCBhbmQgb3RoZXIgZmFjdG9ycy4gCgpHaXZlbiB0aGlzIG91dHB1dCwgdGhlIGJlc3Qgc29uZyBvbiB0aGlzIGxpc3QgaXM6CkVsZWN0cmljIEF2ZW5udWUgYnkgRWRkaWUgR3JhbnQgbWFkZSBpbiAxOTgzIHdpdGggYSBzY29yZSBvZiAuNzI4NzExNDQKCndoYXQgZWxzZSBjYW4gd2UgZmluZCBhYm91dCB0aGlzIHNvbmcgdGhhdCBtYWtlcyBpdCAidGhlIGJlc3QiPwoKYGBge3J9CmFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMkZHVyYXRpb25fbWludXRlcyA8LSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzJGR1cmF0aW9uX21zIC8gKDEwMDAgKiA2MCkKCmFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMgJT4lCiAgZmlsdGVyKHRyYWNrX25hbWUgPT0gIkVsZWN0cmljIEF2ZW5udWUiKSAlPiUKICBzZWxlY3QoZHVyYXRpb25fbWludXRlcywgdHJhY2tfbmFtZSwgZGFuY2VhYmlsaXR5LCB2YWxlbmNlLCBlbmVyZ3ksIGV2ZXJ5dGhpbmcoKSkKYGBgCndlIGNhbiBzZWUgdGhhdCB0aGlzIHNvbmcgaXMgMy4yIG1pbnV0ZXMgbG9uZywgYXMgd2VsbCBhcyBoYXZpbmcgYSB2ZXJ5IGhpZ2ggZGFuY2VhYmlsaXR5IHNjb3JlLiBIb3dldmVyLCB0aGUgZW5lcmd5IHNlZW1zIHRvIGJlIGEgYmUgbG93IHRoZSByZWFzb24gZm9yIGl0IGJlaW5nIHRoZSBiZXN0IG92ZXJhbGwgc29uZyBpcyB0aGUgZmFjdCB0aGF0IGl0cyB2YWxlbmNlIGlzIHJpZ2h0IHVwIHRoZXJlIHdpdGggZGFuY2VhYmlsaXR5IGluIGJlaW5nIHNvIGhpZ2guIEFuZCBhZnRlciBzZWVpbmcgdGhlIHNjb3JlcyBmb3IgaXRzIG90aGVyIHZhcmlhYmxlcywgaXQgY2FuIGJlIGNvbmZpcm1lZCBhcyB0byB3aHkgRWxlY3RyaWMgQXZlbm51ZSBpcyB0aGUgb3ZlcmFsbCBiZXN0IHNvbmcuICAKCgojIERhdGEgY29tcGFyaXNvbnMKCkluIHRoaXMgc2VjdGlvbiB3ZSB3YW50IHRvIGxvb2sgYXQgdGhlc2UgaGl0cyBhcyBhIHdob2xlLiBBcmUgdGhlcmUgYW55IHRyZW5kcyB3ZSBjYW4gc3BvdD8gCgojICB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIE5vbWluYWwgRGF0YQoKVGhlIGZpcnN0IGRhdGEgdHlwZSB3ZSBsb29rZWQgYXQgd2FzIGlmIGEgc29uZyB3YXMgaW4gbWFqb3Igb3IgbWlub3IuCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzLCBhZXMoeCA9IG1vZGUsIGZpbGwgPSBtb2RlKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiY291bnQiLCBzaG93LmxlZ2VuZCA9IEZBTFNFLCBjb2xvciA9ICJibGFjayIsIGFscGhhID0gMC44KSArCiAgZ2VvbV90ZXh0KHN0YXQgPSAiY291bnQiLCBhZXMobGFiZWwgPSBhZnRlcl9zdGF0KGNvdW50KSksIHZqdXN0ID0gLTAuNSkgKwogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIE1vZGUiLAogICAgICAgeCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgIHkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNTZCNEU5IiwgIiNFNjlGMDAiKSkgKwogIHRoZW1lX21pbmltYWwoKSArIAogIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGlja3MgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKQpgYGAKCk5vdyB0aGF0IHdlIGNhbiBzZWUgdGhhdCB0aGUgbWFqb3JpdHkgb2Ygc29uZ3MgYXJlIGluIHRoZSBtYWpvciBtb2RlLiBXZSBkaWRuJ3QgZmVlbCBsaWtlIGl0IHdhcyBlbm91Z2ggYW5kIHdhbnRlZCB0byBrbm93IHRoZSBhbW91bnQgb2YgZWFjaCBkaWZmZXJlbnQga2V5IG1vZGVzIG9mIGFsbCB0aGUgc29uZ3Mgb3ZlciB0aGUgeWVhcnMuCgoKVGhlcmVmb3JlLCB3ZSB3aWxsIGZpbmQgdGhlIHNwZWNpZmljIGNvdW50cyBvZiBlYWNoIGtleSBtb2RlIGluIHRoaXMgZ3JhcGg6CgpgYGB7cn0KbGlicmFyeShkcGx5cikKCmFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMgJT4lCiAgY291bnQoa2V5X21vZGUsIG1vZGUpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoa2V5X21vZGUsIG4pLCB5ID0gbiwgZmlsbCA9IG1vZGUpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksIHZqdXN0ID0gMC41LCBoanVzdCA9IDEpICsKICBsYWJzKHRpdGxlID0gIkRpc3RyaWJ1dGlvbiBvZiBLZXkgTW9kZSIsCiAgICAgICB4ID0gIktleSBNb2RlIiwKICAgICAgIHkgPSBlbGVtZW50X2JsYW5rKCkpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjNjZjMmE1IiwgIiNmYzhkNjIiKSwgbmFtZSA9ICJNb2RlIikgKwogIHRoZW1lX21pbmltYWwoKSArIAogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50aWNrcyA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgpgYGAKQW5kIGFmdGVyIGEgcXVpY2sgbG9vaywgd2UgY2FuIHNlZSB0aGF0IG1vc3Qgc29uZ3MgaGF2ZSB1c2VkIEMgbWFqb3IgaW4gdGhlIGJpbGxib2FyZCBzdW1tZXIgaGl0cy4gTWF5YmUgdGhpcyBtZWFucyBDIG1ham9yIGlzIHRoZSBiZXN0IGtleSBtb2RlIGZvciBtYWtpbmcgdGhlIHRvcCBiaWxsYm9hcmQgc3VtbWVyIGhpdHM/CgpUaGUgdGFibGUgYmVsb3cgaXMganVzdCB0byBzaG93IHNvbWUgc29uZ3MgdGhhdCBhcmUgaW4gdGhlIEMgbWFqb3Iga2V5IG1vZGU6CmBgYHtyfQphbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzICU+JQogIGZpbHRlcihrZXlfbW9kZSA9PSAiQyBtYWpvciIpICU+JQogIHNlbGVjdChrZXlfbW9kZSwgdHJhY2tfbmFtZSwgZXZlcnl0aGluZygpKQpgYGAKCgojIyBMb3VkbmVzcwoKKkxldCdzIHRha2UgYSBsb29rIGF0IHRoZSBMb3VkbmVzcyBzY2FsZToqIAoKYGBge3J9CmRpc19sb3VkIDwtIGdncGxvdChkYXRhID0gYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cywgYWVzKHggPSBsb3VkbmVzcykpICsKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IC41LCBmaWxsID0gIiMzNDk4ZGIiLCBjb2xvciA9IiMyYzNlNTAiLCBhbHBoYSA9IC41KSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgTG91ZG5lc3MiLAogICAgIHggPSAiTG91ZG5lc3MiLAogICAgIHkgPSAiRnJlcXVlbmN5IikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyfQpnZ3Bsb3RseShkaXNfbG91ZCkKYGBgCgpIZXJlIHdlIGNhbiBzZWUgdGhhdCB0aGUgbWFqb3JpdHkgb2Ygc29uZ3MgbGF5IGJldHdlZW4gLTEwIERiIGFuZCAtNSBEYiwgYXMgd2VsbCBhcyB0aGUgZGF0YSBoYXZpbmcgYSBsZWZ0IHNrZXcuIFdlIHdhbnRlZCB0byBtYWtlIGEgdmVyeSBzaW1wbGUgYW5kIGVhc3kgZ3JhcGggdG8gbG9vayBhdCBmb3IgdGhlIGxvdWRuZXNzIHNjYWxlLCBtYWtpbmcgaXQgaW50ZXJhY3RpdmUgd2l0aCBwbG90bHkgYWxsb3dzIGZvciB1c2VycyB0byBob3ZlciBvdmVyIHRoZSBiYXJzIHRvIHNlZSB0aGUgaW5kaXZpZHVhbCBjb3VudHMgZm9yIGVhY2ggbG91ZG5lc3Mgc2NhbGUgaW50ZWdlci4gV2l0aCB0aGUgaGlnaGVzdCBiZWluZyA0MiBzb25ncyBhdCBhIGRlY2liZWwgbGV2ZWwgb2YgLTYuCgoKKk5vdyBsZXQgdXMgdGFrZSBhIGxvb2sgYXQgbG91ZG5lc3MgY29tcGFyZWQgd2l0aCBvdGhlciB2YXJpYWJsZXM6KgoKRmlyc3QgdXAgaXMgbG91ZG5lc3MgY29tcGFyZWQgdG8gbGl2ZW5lc3MKCmBgYHtyfQpsb3VkX3ZfbGl2ZSA8LSBnZ3Bsb3QoZGF0YSA9IGFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMsIGFlcyh4ID0gbGl2ZW5lc3MsIHkgPSBsb3VkbmVzcykpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43LCBzaXplID0gMywgY29sb3IgPSAiIzM0OThkYiIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjMmMzZTUwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGxhYnModGl0bGUgPSAiTG91ZG5lc3MgdnMgTGl2ZW5lc3MiLAogICAgICAgeCA9ICJMaXZlbmVzcyIsCiAgICAgICB5ID0gIkxvdWRuZXNzIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyfQpnZ3Bsb3RseShsb3VkX3ZfbGl2ZSkKYGBgClRoaXMgZ3JhcGggc2hvd3MgdGhhdCB0aGVyZSBpcyBubyByZWxhdGlvbnNoaXAgYmV0d2VlbiBsaXZlbGluZXNzIGFuZCBsb3VkbmVzcy4gVGhvdWdoLCBpdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IG1vc3Qgc29uZ3Mgb25seSBoYXZlIGEgc2xpZ2h0IGxpdmUgZWxlbWVudCB0byB0aGVtLiBUaGlzIGlzIHByb2JhYmx5IHRoZSBvdXRjb21lIG9mIHNvbmdzIGJlaW5nIHJlY29yZGVkIGluIHJlY29yZGluZyBzdHVkaW9zIGFzIG9wcG9zZWQgdG8gbGl2ZSBwZXJmb3JtYW5jZXMuCgpgYGB7cn0KYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUKICBzZWxlY3QobGl2ZW5lc3MsIGxvdWRuZXNzLCB0cmFja19uYW1lKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMsIGFlcyh4ID0gZW5lcmd5LCB5ID0gbG91ZG5lc3MpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNywgc2l6ZSA9IDMsIGNvbG9yID0gIiMzNDk4ZGIiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIixjb2xvciA9ICIjMmMzZTUwIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIGxhYnModGl0bGUgPSAiTG91ZG5lc3MgdnMgRW5lcmd5IiwKICAgICAgIHggPSAiRW5lcmd5IiwKICAgICAgIHkgPSAiTG91ZG5lc3MiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKYGBgCkVuZXJneSBhbmQgbG91ZG5lc3MgaGF2ZSBhIGZhdm9yYWJsZSBjb3JyZWxhdGlvbiB3aXRoIG9uZSBhbm90aGVyLiBUaGlzIGZpbmRpbmcgc3VwcG9ydHMgb3VyIGVhcmxpZXIgdGhlb3JpZXMgdGhhdCBzdWdnZXN0ZWQgdGhhdCBlbmVyZ3kgbGV2ZWxzIHdvdWxkIGluY3JlYXNlIHdpdGggbXVzaWMgdm9sdW1lLgoKYGBge3J9CmFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMgJT4lCiAgc2VsZWN0KGVuZXJneSwgbG91ZG5lc3MsICB0cmFja19uYW1lKQpgYGAKCiMjIERhbmNlYWJpbGl0eQoKKk5leHQgbGV0J3MgdGFrZSBhIGxvb2sgYXQgdGhlIGRhbmNlYWJpbGl0eSBzY2FsZToqIAoKYGBge3J9CmdncGxvdChkYXRhID0gYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cywgYWVzKHggPSBkYW5jZWFiaWxpdHkpKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAuMDUsIGZpbGwgPSAiIzhlNDRhZCIsIGNvbG9yID0gIiMwMDgwODAiLCBhbHBoYSA9IC41KSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgRGFuY2VhYmlsaXR5IiwKICAgICB4ID0gIkRhbmNlYWJpbGl0eSIsCiAgICAgeSA9ICJGcmVxdWVuY3kiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYApUaGUgc29uZyBkaXN0cmlidXRpb24gaXMgc2tld2VkIHNsaWdodGx5IHRvIHRoZSBsZWZ0IGFuZCBmb2xsb3dzIGEgc3RhbmRhcmQgYmVsbCBzaGFwZS4gVGhpcyBkZW1vbnN0cmF0ZXMgdGhhdCBtb3N0IG9mIHRoZXNlIHNpbmdsZXMgYXJlIGF0IGxlYXN0IHNvbWV3aGF0IGRhbmNlYWJsZS4gCgoqTmV4dCBsZXQgdXMgdGFrZSBhIGxvb2sgYXQgZGFuY2VhYmlsaXR5IGNvbXBhcmVkIHdpdGggb3RoZXIgdmFyaWFibGVzOioKCkZpcnN0IHdlIHdpbGwgdGFrZSBhIGxvb2sgYXQgRW5lcmd5IGNvbXBhcmVkIHRvIERhbmNlYWJpbGl0eToKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMsIGFlcyh4ID0gZGFuY2VhYmlsaXR5LCB5ID0gZW5lcmd5KSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUsIHNpemUgPSAzLCBjb2xvciA9ICIjOGU0NGFkIikgKyAgIyBBZGp1c3RlZCBwb2ludCBhZXN0aGV0aWNzCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiIzAwODA4MCIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBsYWJzKHRpdGxlID0gIkRhbmNlYWJpbGl0eSB2cyBFbmVyZ3kiLAogICAgICAgeCA9ICJEYW5jZWFiaWxpdHkiLAogICAgICAgeSA9ICJFbmVyZ3kiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKVGhlcmUgaXMgYSBzbWFsbCBjb3JyZWxhdGlvbiBiZXR3ZWVuIGVuZXJneSBhbmQgZGFuY2VhYmlsaXR5LiBUaG91Z2ggd2UgY2FuIHNlZSB0aGUgYmVzdCByYW5nZSBmb3IgYSBzb25nJ3MgZGFuY2VhYmlsaXR5IGlzIGZyb20gLjUgdG8gLjc1LgpgYGB7cn0KYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUKICBzZWxlY3QoZW5lcmd5LCBkYW5jZWFiaWxpdHksIHRyYWNrX25hbWUpCmBgYAoKCldpbGwgd2Ugc2VlIHRoZSBzYW1lIHRoaW5nIHdpdGggdGVtcG8/CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzLCBhZXMoeCA9IGRhbmNlYWJpbGl0eSwgeSA9IHRlbXBvKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUsIHNpemUgPSAzLCBjb2xvciA9ICIjOGU0NGFkIikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiMwMDgwODAiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgbGFicyh0aXRsZSA9ICJEYW5jZWFiaWxpdHkgdnMgVGVtcG8iLAogICAgICAgeCA9ICJEYW5jZWFiaWxpdHkiLAogICAgICAgeSA9ICJUZW1wbyIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCkEgc29uZydzIGRhbmNlYWJpbGl0eSBjYW4gYmUgdmlld2VkIGFzIGEgZnVuY3Rpb24gb2YgaXRzIHRlbXBvOyB0aGlzIGdyYXBoIGluZGljYXRlcyB0aGF0IGEgdGVtcG8gb2YgYmV0d2VlbiAxNTAgYW5kIDEwMCBpcyBpZGVhbC4KCmBgYHtyfQphbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzICU+JQogIHNlbGVjdCh0ZW1wbywgZGFuY2VhYmlsaXR5LCB0cmFja19uYW1lKQpgYGAKCiMjIFZhbGVuY2UKClRvIHdoYXQgZXh0ZW50IGFyZSBzb25ncyBoYXBweT8gTGV0IHVzIGV4YW1pbmUgdGhlIGZvbGxvd2luZyBwYWlyIG9mIGdyYXBoczoKCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzLCBhZXMoeCA9ICIiLCB5ID0gdmFsZW5jZSkpICsKICBnZW9tX2JveHBsb3QoZmlsbCA9ICIjMmVjYzcxIiwgY29sb3IgPSAiI2U2N2UyMiIsIGFscGhhID0gMC4yKSArCiAgbGFicyh0aXRsZSA9ICJCb3hwbG90IG9mIFZhbGVuY2UiLAogICAgICAgeSA9ICJWYWxlbmNlIikgKwogIGNvb3JkX2ZsaXAoKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgoKYGBge3J9CmdncGxvdChkYXRhID0gYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cywgYWVzKHggPSB2YWxlbmNlKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gLjA1LCBmaWxsID0gIiMyZWNjNzEiLCBjb2xvciA9ICIjZTY3ZTIyIiwgYWxwaGEgPSAuMikgKwogIGxhYnModGl0bGUgPSAiRGlzdHJpYnV0aW9uIG9mIFZhbGVuY2UiLAogICAgIHggPSAiVmFsZW5jZSIsCiAgICAgeSA9ICJGcmVxdWVuY3kiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCkFjY29yZGluZyB0byB0aGVzZSBncmFwaHMsIGhhcHBpbmVzcyBoYXMgYSBzaWduaWZpY2FudCBsZWZ0d2FyZCBza2V3LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgbWFqb3JpdHkgb2Ygc29uZ3MgdGhhdCBiZWNvbWUgaGl0cyB3aWxsIHNvdW5kIGhhcHB5Lgo8YnI+CkxldCdzIG5vdyBleGFtaW5lIGFuIGVuZXJneSBhbmQgdmFsZW5jZSBzY2F0dGVyIHBsb3Q6CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzLCBhZXMoeCA9IHZhbGVuY2UsIHkgPSBlbmVyZ3kgKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIsIHNpemUgPSAzLCBjb2xvciA9ICIjMmVjYzcxIikgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG9yID0gIiNlNjdlMjIiLCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgbGFicyh0aXRsZSA9ICJWYWxlbmNlIHZzIEVuZXJneSIsCiAgICAgICB4ID0gIlZhbGVuY2UiLAogICAgICAgeSA9ICJFbmVyZ3kiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKSW4gYW55IGV2ZW50LCBJIGRvbid0IHRoaW5rIHRoaXMgaXMgYWxsIHRoYXQgc3VycHJpc2luZy4gSXQgYXBwZWFyZWQgZXZpZGVudCB0aGF0IGhhcHBpbmVzcyBhbmQgZW5lcmd5IHdlcmUgcG9zaXRpdmVseSBjb3JyZWxhdGVkLgoKYGBge3J9CmFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMgJT4lCiAgc2VsZWN0KGVuZXJneSwgdmFsZW5jZSwgdHJhY2tfbmFtZSkKYGBgCgojIEFydGlzdCBpbnNpZ2h0CldlIHdhbnQgdG8gZXhhbWluZSB0aGUgYXJ0aXN0IHdpdGggdGhlIGdyZWF0ZXN0IGhpdHMgaW4gdGhpcyBzZWN0aW9uIGFuZCBjb21wYXJlIHRoZW0gdG8gdGhlaXIgY29udGVtcG9yYXJpZXMuIERvZXMgc2FpZCBhcnRpc3QgYWRoZXJlIHRvIHRoZSBlc3RhYmxpc2hlZCB0cmVuZHM/IE9yIGFyZSB0aGV5IGdvaW5nIHRvIG92ZXJsb29rIHRoZW0/CgojICB7LnRhYnNldCAudGFic2V0LWZhZGUgLnRhYnNldC1waWxsc30KCiMjIEV4cGxvcmF0aW9uCgpXaGF0IGFydGlzdCBoYXMgdGhlIG1vc3Qgc3VtbWVyIGhpdHM/CgpgYGB7cn0KYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUgCiAgZ3JvdXBfYnkoYXJ0aXN0X25hbWUpICU+JSAKICBzdW1tYXJpc2UoY291bnQgPSBuKCkpICU+JSAKICBhcnJhbmdlKGRlc2MoY291bnQpKSAlPiUgCiAgc2xpY2VfaGVhZChuID0gMSkKCmBgYApXaXRoIHNldmVuIGVudHJpZXMgb24gdGhlIGxpc3QsIFJpaGFubmEgZGVmZWF0ZWQgZXZlcnkgb3RoZXIgYXJ0aXN0IHRvIHRha2UgdGhlIHRvcCBzcG90LiBXaGljaCBzb25ncyB3ZXJlIHRoZXNlPwoKYGBge3J9CnJpaGFubmFfc29uZ3MgPC0gYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUgCiAgZmlsdGVyKGFydGlzdF9uYW1lID09ICJSaWhhbm5hIikKCnJpaGFubmFfc29uZ3MgJT4lIApzZWxlY3QodHJhY2tfbmFtZSwgeWVhcikKYGBgCgoKVGhlIGxpc3Qgb2Ygc29uZ3MgaXMgdmlzaWJsZSBhYm92ZS4gV2UgaGF2ZSBsaXN0ZWQgdGhlIHNvbmdzIGJlbG93IGFsb25nIHdpdGggZXZlcnkgY2hhcmFjdGVyaXN0aWMgdGhhdCBoYXMgYmVlbiBsaW5rZWQgdG8gdGhlbS4KCgpgYGB7cn0KcmloYW5uYV9zb25ncwpgYGAKCiMjIFJpaGFubmEgTm9taW5hbCBHcmFwaHMKCkFzIGluIHRoZSBwcmlvciBzZWN0aW9ucywgbGV0J3Mgc3RhcnQgYnkgZXhhbWluaW5nIFJpaGFubmEncyBub21pbmFsIHN0YXRpc3RpY3M6CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSByaWhhbm5hX3NvbmdzKSArCiAgZ2VvbV9iYXIoYWVzKHggPSBtb2RlLCBmaWxsID0gbW9kZSksIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjgsIHN0YXQgPSAiY291bnQiKSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgTW9kZXMgaW4gUmloYW5uYSdzIFNvbmdzIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiMzNDk4ZGIiLCAiI2U3NGMzYyIpKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgKICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgYXhpcy50aXRsZS55ID0gZWxlbWVudF9ibGFuaygpLAogIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCldpdGggYSBoaWdoZXIgYXZlcmFnZSBvZiBzb25ncyBpbiBhIG1pbm9yIG1vZGUsIFJpaGFubmEgYmVhdHMgdGhlIG1lYW4gd2l0aCBhIHJhdGlvIG9mIDQ6My4KCgoKIyMgUmloYW5uYSBDb21wYXJpc29ucwpMZXQgdXMgdGFrZSBhIHF1aWNrIGxvb2sgYXQgUmloYW5uYSdzIHBsYWNlbWVudHMgaW4gc29tZSBvZiBvdXIgcHJldmlvdXMgZ3JhcGhzLiBIb3cgd2lsbCBzaGUgY29tcGFyZT8KCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMsIGFlcyh4ID0gZGFuY2VhYmlsaXR5LCB5ID0gdGVtcG8pKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNywgc2l6ZSA9IDMsIGNvbG9yID0gIiMzNDk4ZGIiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiI2U3NGMzYyIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAKICAjYWRkIHJpaGFubmFzIHNvbmdzCiAgZ2VvbV9wb2ludChkYXRhID0gcmloYW5uYV9zb25ncywgYWVzKHggPSBkYW5jZWFiaWxpdHksIHkgPSB0ZW1wbyksIGFscGhhID0gMSwgc2l6ZSA9IDMsIGNvbG9yID0gIiMyZWNjNzEiKSArCiAgCiAgbGFicyh0aXRsZSA9ICJEYW5jZWFiaWxpdHkgdnMgVGVtcG8iLAogICAgICAgeCA9ICJEYW5jZWFiaWxpdHkiLAogICAgICAgeSA9ICJUZW1wbyIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzLCBhZXMoeCA9IGxpdmVuZXNzLCB5ID0gbG91ZG5lc3MpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNywgc2l6ZSA9IDMsIGNvbG9yID0gIiMzNDk4ZGIiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiI2U3NGMzYyIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAKICAjIEFkZCBSaWhhbm5hJ3Mgc29uZ3MKICBnZW9tX3BvaW50KGRhdGEgPSByaWhhbm5hX3NvbmdzLCBhZXMoeCA9IGxpdmVuZXNzLCB5ID0gbG91ZG5lc3MpLCBhbHBoYSA9IDEsIHNpemUgPSAzLCBjb2xvciA9ICIjMmVjYzcxIikgKwogIAogIGxhYnModGl0bGUgPSAibG91ZG5lc3MgdnMgTGl2ZW5lc3MiLAogICAgICAgeCA9ICJMaXZlbmVzcyIsCiAgICAgICB5ID0gIkxvdWRuZXNzIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCmBgYAoKCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IGFsbF9iaWxsYm9hcmRfc3VtbWVyX2hpdHMsIGFlcyh4ID0gdmFsZW5jZSwgeSA9IGVuZXJneSkpICsKICBnZW9tX3BvaW50KGFscGhhID0gMC43LCBzaXplID0gMywgY29sb3IgPSAiIzM0OThkYiIpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjZTc0YzNjIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIAogICMgQWRkIFJpaGFubmEncyBzb25ncwogIGdlb21fcG9pbnQoZGF0YSA9IHJpaGFubmFfc29uZ3MsIGFlcyh4ID0gdmFsZW5jZSwgeSA9IGVuZXJneSksIGFscGhhID0gMSwgc2l6ZSA9IDMsIGNvbG9yID0gIiMyZWNjNzEiKSArCiAgCiAgbGFicyh0aXRsZSA9ICJWYWxlbmNlIHZzIEVuZXJneSIsCiAgICAgICB4ID0gIlZhbGVuY2UiLAogICAgICAgeSA9ICJFbmVyZ3kiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKYGBgCgoKUmloYW5uYSdzIG11c2ljIGhhcyBhYm92ZS1hdmVyYWdlIGRhbmNlYWJpbGl0eSBhbmQgYSBkeW5hbWljIHRvdWNoIHRoYW5rcyB0byBpdHMgdmFyeWluZyB0ZW1wby4gSGVyIHN0dWRpby1jZW50cmljIHN0eWxlLCB3aGljaCBpcyBwb3NpdGlvbmVkIG9uIHRoZSBmYXIgbGVmdCBmb3IgbGl2ZWxpbmVzcywgaXMgaW4gbGluZSB3aXRoIHRoYXQgb2Ygb3RoZXIgYXJ0aXN0cy4gSGVyIHNvbmdzIGFyZSBub3RhYmxlIGZvciB0aGVpciBjb25zdGFudCBlbXBoYXNpcyBvbiB2b2x1bWUsIHdoaWNoIGhhcyBhIHN0cmlraW5nIGFuZCBjYXB0aXZhdGluZyBlZmZlY3QuIFJpaGFubmEncyBtdXNpYyBleHBsb3JlcyBhIHJhbmdlIG9mIGVuZXJneSBsZXZlbHMgd2hpbGUga2VlcGluZyBhIGNlbnRyYWwgdmFsZW5jZSwgbWFraW5nIGZvciBhIHZhcmllZCBhbmQgY2FwdGl2YXRpbmcgbGlzdGVuaW5nIGV4cGVyaWVuY2UuCgoKQXMgd2UgaGF2ZSBzaG93biBSaWhhbm5hIG1ha2VzIHVuaXF1ZSBtdXNpYyBjb21wYXJlZCB0byBtdXNpYyBhcyBhIHdob2xlLiBCdXQsIGxldHMgc2VlIGlmIHNoZSBnZXRzIGNsb3NlciB0byB0aGUgbWVhbiB3aGVuIHdlIGxvb2sgYXQgaGVyIHNvbmdzIHBlciB5ZWFyOgoKYGBge3J9CnNwZWNpZmljX3llYXJzIDwtIGMoMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAxMiwgMjAxNikgIyBZZWFycyB0aGF0IFJpaGFubmEgY2hhcnRlZAoKZmlsdGVyZWRfZGF0YSA8LSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzICU+JQogIGZpbHRlcih5ZWFyICVpbiUgc3BlY2lmaWNfeWVhcnMpCgpnZ3Bsb3QoZGF0YSA9IGZpbHRlcmVkX2RhdGEsIGFlcyh4ID0gZGFuY2VhYmlsaXR5LCB5ID0gdGVtcG8pKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAiT3RoZXIiKSwgYWxwaGEgPSAwLjcsIHNpemUgPSAzKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiI2U3NGMzYyIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAKICBnZW9tX3BvaW50KGRhdGEgPSByaWhhbm5hX3NvbmdzLCBhZXMoY29sb3IgPSAiUmloYW5uYSIpLCBhbHBoYSA9IDEsIHNpemUgPSAzKSArCiAgCiAgbGFicyh0aXRsZSA9ICJEYW5jZWFiaWxpdHkgYW5kIFRlbXBvIiwKICAgICAgIHggPSAiRGFuY2VhYmlsaXR5IiwKICAgICAgIHkgPSAiVGVtcG8iKSArCiAgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIk90aGVyIiA9ICIjMzQ5OGRiIiwgIlJpaGFubmEiID0gIiMyZWNjNzEiKSwgbmFtZSA9ICJMZWdlbmQiKSArCiAgCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIAogICMgRmFjZXQgYnkgeWVhcgogIGZhY2V0X3dyYXAofiB5ZWFyLCBzY2FsZXMgPSAiZnJlZSIpCgpgYGAKCmBgYHtyfQpzcGVjaWZpY195ZWFycyA8LSBjKDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMTIsIDIwMTYpICMgWWVhcnMgdGhhdCBSaWhhbm5hIGNoYXJ0ZWQKCmZpbHRlcmVkX2RhdGEgPC0gYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUKICBmaWx0ZXIoeWVhciAlaW4lIHNwZWNpZmljX3llYXJzKQoKZ2dwbG90KGRhdGEgPSBmaWx0ZXJlZF9kYXRhLCBhZXMoeCA9IGxpdmVuZXNzLCB5ID0gbG91ZG5lc3MpKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSAiT3RoZXIiKSwgYWxwaGEgPSAwLjcsIHNpemUgPSAzKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgY29sb3IgPSAiI2U3NGMzYyIsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICAKICBnZW9tX3BvaW50KGRhdGEgPSByaWhhbm5hX3NvbmdzLCBhZXMoY29sb3IgPSAiUmloYW5uYSIpLCBhbHBoYSA9IDEsIHNpemUgPSAzKSArCiAgCiAgbGFicyh0aXRsZSA9ICJMb3VkbmVzcyB2cyBMaXZlbmVzcyIsCiAgICAgICB4ID0gIkxpdmVuZXNzIiwKICAgICAgIHkgPSAiTG91ZG5lc3MiKSArCiAgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIk90aGVyIiA9ICIjMzQ5OGRiIiwgIlJpaGFubmEiID0gIiMyZWNjNzEiKSwgbmFtZSA9ICJMZWdlbmQiKSArCiAgCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikgKwogIAogICMgRmFjZXQgYnkgeWVhcgogIGZhY2V0X3dyYXAofiB5ZWFyLCBzY2FsZXMgPSAiZnJlZSIpCmBgYAoKCgoKYGBge3J9CnNwZWNpZmljX3llYXJzIDwtIGMoMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAxMiwgMjAxNikgIyBZZWFycyB0aGF0IFJpaGFubmEgY2hhcnRlZAoKZmlsdGVyZWRfZGF0YSA8LSBhbGxfYmlsbGJvYXJkX3N1bW1lcl9oaXRzICU+JQogIGZpbHRlcih5ZWFyICVpbiUgc3BlY2lmaWNfeWVhcnMpCgpnZ3Bsb3QoZGF0YSA9IGZpbHRlcmVkX2RhdGEsIGFlcyh4ID0gdmFsZW5jZSwgeSA9IGVuZXJneSkpICsKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9ICJPdGhlciIpLCBhbHBoYSA9IDAuNywgc2l6ZSA9IDMpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvciA9ICIjZTc0YzNjIiwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIAogIGdlb21fcG9pbnQoZGF0YSA9IHJpaGFubmFfc29uZ3MsIGFlcyhjb2xvciA9ICJSaWhhbm5hIiksIGFscGhhID0gMSwgc2l6ZSA9IDMpICsKICAKICBsYWJzKHRpdGxlID0gIlZhbGVuY2UgdnMgRW5lcmd5IiwKICAgICAgIHggPSAiVmFsZW5jZSIsCiAgICAgICB5ID0gIkVuZXJneSIpICsKICAKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiT3RoZXIiID0gIiMzNDk4ZGIiLCAiUmloYW5uYSIgPSAiIzJlY2M3MSIpLCBuYW1lID0gIkxlZ2VuZCIpICsKICAKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArCiAgCiAgIyBGYWNldCBieSB5ZWFyCiAgZmFjZXRfd3JhcCh+IHllYXIsIHNjYWxlcyA9ICJmcmVlIikKYGBgCgpUaGVzZSBncmFwaHMgZGVtb25zdHJhdGUgdGhhdCBSaWhhbm5hIGlzLCBpbiBmYWN0LCBleGNlcHRpb25hbC4gSGVyIHNvbmdzIGFyZSB0eXBpY2FsbHkgZm91bmQgb24gdGhlIGVkZ2Ugb2YgdGhlIHVuY2VydGFpbnR5IGNvbmUsIGJ1dCB0aGVyZSBpcyByb29tIGZvciB1bmNlcnRhaW50eSB3aXRoIG9ubHkgMTAgc2FtcGxlcy4gSGVyIG11c2ljIGRpZCBzZWVtIHRvIGRldmlhdGUgdGhlIG1vc3QgZnJvbSB0aGUgbWVhbiBpbiAyMDA3LCBhbmQgd2FzIHRoZSBjbG9zZXN0IGluIDIwMDggJiAyMDEyLgoKIyMgU3VtbWFyeQoKUmloYW5uYSdzIGluY3JlZGlibGUgbXVzaWNhbCBhYmlsaXR5LCB3aGljaCBjb21iaW5lcyBkeW5hbWljIHRlbXBvIGNoYW5nZXMgYW5kIGFib3ZlLWF2ZXJhZ2UgZGFuY2VhYmlsaXR5LCBmaXRzIGluIHdpdGggb3RoZXIgYXJ0aXN0cyBpbiBhIHN0dWRpby1jZW50cmljIGxpdmVsaW5lc3MuIEhlciBzb25ncyBzdGFuZCBvdXQgZm9yIGVtcGhhc2l6aW5nIGxvdWRuZXNzLCB3aGljaCBwcm9kdWNlcyBhbiBhcnJlc3RpbmcgYW5kIGFsbHVyaW5nIGVmZmVjdC4gQWx0aG91Z2ggdGhlcmUgaXMgc29tZSB1bmNlcnRhaW50eSBkdWUgdG8gdGhlIHNtYWxsIDEwLXNhbXBsZSBzaXplLCB0aGUgZ3JhcGhzIHNob3cgdGhhdCBoZXIgbXVzaWMgcmVndWxhcmx5IGZhbGxzIG9uIHRoZSBlZGdlIG9mIHRoZSB1bmNlcnRhaW50eSBjb25lLiBXaGlsZSBoZXIgbXVzaWMgY2FtZSB2ZXJ5IGNsb3NlIHRvIHRoZSBtZWFuIGluIDIwMDggYW5kIDIwMTIsIHRoZXJlIHdlcmUgc29tZSBub3RhYmxlIGRlcGFydHVyZXMgZnJvbSB0aGUgbWVhbiBpbiAyMDA3LiBUaGlzIGNvbWJpbmF0aW9uIGhpZ2hsaWdodHMgUmloYW5uYSdzIGludGVyZXN0aW5nIGFuZCB2YXJpZWQgY2FyZWVyIGluIG11c2ljLCBib3RoIHN0eWxpc3RpY2FsbHkgYW5kIG51bWVyaWNhbGx5LgoKIyBGb3IgRnV0dXJlIENvbnNpZGVyYXRpb24KCkRvZXMgbGVuZ3RoIG9mIHNvbmcgY29ycmVsYXRlIHRvIGRhbmNlYWJpbGl0eSBzY29yZXM/IApgYGB7cn0KZGYgPC0gYWxsX2JpbGxib2FyZF9zdW1tZXJfaGl0cyAlPiUKICBzZWxlY3QoZGFuY2VhYmlsaXR5LCBkdXJhdGlvbl9tcywgdHJhY2tfbmFtZSwgYXJ0aXN0X25hbWUpICU+JQogIGFycmFuZ2UoZGVzYyhkdXJhdGlvbl9tcykpCgpkZiRkdXJhdGlvbl9taW51dGVzIDwtIGRmJGR1cmF0aW9uX21zIC8gKDEwMDAgKiA2MCkKCmRmICU+JQogIHNlbGVjdChkYW5jZWFiaWxpdHksIGR1cmF0aW9uX21pbnV0ZXMsIHRyYWNrX25hbWUsIGFydGlzdF9uYW1lKQoKCgpgYGAKCkluIHRoZSBlbmQsIHdlIHZlcnkgYnJpZWZseSBsb29rZWQgaW50byB3aGF0IHNvbWUgY29ycmVsYXRpb25zIGNvdWxkIGJlIGJldHdlZW4gdGhlIGxlbmd0aCBvZiBzb25ncyBhbmQgdGhlaXIgZGFuY2VhYmlsaXR5IHNjb3JlLiBBcyB3ZSBjYW4gc2VlIGFib3ZlIGluIHRoZSB0YWJsZSwgdGhlIGxvbmdlc3Qgc29uZyAoaW4gbWludXRlcykgaXMgIkkgd2FudCB5b3VyIHNleCBQdHMgMSBhbmQgMiByZW1hc3RlcmVkIiBieSBHZW9yZ2UgTWljaGFlbHMgd2l0aCBhIGRhbmNlYWJpbGl0eSBzY29yZSBvZiAuODEyLiBCdXQgcmlnaHQgYmVsb3cgaXQgaXMgYW4gOC45NSBtaW51dGUgbG9uZyBzb25nIHdpdGggYSBzY29yZSBvZiAuMjE3LiBXaGljaCB0byB1cywgbWFrZXMgYSBsb3Qgb2Ygc2Vuc2UsIGlmIGEgc29uZyBpcyB2ZXJ5IGxvbmcgdGhlbiB5b3Ugd291bGRuJ3Qgd2FudCB0byBkYW5jZSBmb3IgdG9vIGxvbmcgYnV0IHRoZW4gaXQgc2VlbXMgbGlrZSB0aGVyZSBjb3VsZCBiZSBvdXRsaWVycyB0byB0aGlzLiBXZSB3YW50ZWQgdG8gbGVhdmUgdGhpcyBmb3IgdGhlIGVuZCBmb3IgZnV0dXJlIGNvbnNpZGVyYXRpb24gdG8gdGFrZSBpdCBmdXJ0aGVyIHdoZW4gd2UgYXJlIG1vcmUgcHJvZmljaWVudCB0aGFuIHdlIGFyZSB3aXRoIFIgdG8gZmluZCBvdXQgbW9yZSBhYm91dCB0aGlzIGRldGFpbC4gCgojIENvbmNsdXNpb24KCkluIGNvbmNsdXNpb24sIG91ciBpbnZlc3RpZ2F0aW9uIGhhcyBleHBsb3JlZCB0aGUgZHluYW1pYyBlbnZpcm9ubWVudCBvZiBCaWxsYm9hcmQgc3VjY2Vzc2VzIGJldHdlZW4gMTk1OSBhbmQgMjAxNywgcmV2ZWFsaW5nIG5vdGFibGUgY2hhbmdlcyBpbiBtdXNpY2FsIHN0eWxlcyBhbmQgdHJhaXRzLiBXZSBjcmVhdGVkIGEgZm9ybXVsYSB0byBvYmplY3RpdmVseSBpZGVudGlmeSB0aGUgZ3JlYXRlc3Qgc29uZyBvdmVyYWxsIGluIHRoZSBCaWxsYm9hcmQgc3VtbWVyIGhpdHMgZGF0YXNldCBieSB1c2luZyBhIHRob3JvdWdoIGFuYWx5c2lzLiBUaGlzIGZvcm11bGEgdG9vayBpbnRvIGFjY291bnQgaW1wb3J0YW50IHBhcmFtZXRlcnMgbGlrZSBkYW5jZWFiaWxpdHksIGxpdmVuZXNzLCBlbmVyZ3ksIGFuZCBtb3JlLiBXZSBkZXZlbG9wZWQgYSBncmFkaW5nIHN5c3RlbSB0aGF0IGFzc2lnbnMgc29uZ3MgdG8gdGllcnMgYmFzZWQgb24gb3VyIG1ldGljdWxvdXMgc3R1ZHkgYW5kIGJhbGFuY2luZyBvZiB0aGVzZSBlbGVtZW50cywgb2ZmZXJpbmcgYW4gb2JqZWN0aXZlIGV2YWx1YXRpb24gb2YgdGhlaXIgZ2VuZXJhbCBxdWFsaXR5LiBBbmFseXppbmcgbm9taW5hbCBkYXRhIGV4cG9zZWQgaW50ZXJlc3RpbmcgdHJlbmRzLCBsaWtlIHRoZSBkb21pbmFuY2Ugb2YgQyBtYWpvciBrZXkgbW9kZSBhbmQgdGhlIGZyZXF1ZW5jeSBvZiBzb25ncyBpbiB0aGUgbWFqb3IgbW9kZS4gV2UgYWxzbyBsb29rZWQgaW50byB2YWxlbmNlLCBsb3VkbmVzcywgYW5kIGRhbmNlYWJpbGl0eSwgZmluZGluZyBwYXR0ZXJucyBhbmQgaW5zaWdodHMgaW50byB0aGUgY29ubmVjdGlvbnMgYmV0d2VlbiB0aGVzZSBtdXNpY2FsIGNvbXBvbmVudHMuIEFkZGl0aW9uYWwgYXJ0aXN0LXNwZWNpZmljIHJlc2VhcmNoLCB3aXRoIGEgc3BlY2lhbCBmb2N1cyBvbiBSaWhhbm5hLCBoaWdobGlnaHRlZCBoZXIgdW5pcXVlIG11c2ljYWwgcXVhbGl0aWVzIGFuZCB0aGUgZGl2ZXJzaXR5IGFuZCBvcmlnaW5hbGl0eSBzZWVuIGluIHRoZSBsYXJnZXIgZGF0YXNldC4gQWxsIHRoaW5ncyBjb25zaWRlcmVkLCBvdXIgc3R1ZHkgcHJvdmlkZXMgYSB0aG9yb3VnaCBleGFtaW5hdGlvbiBvZiB0aGUgbXVzaWNhbCBsYW5kc2NhcGUgb3ZlciB0aGUgY291cnNlIG9mIHNpeCBkZWNhZGVzLCBwcm92aWRpbmcgaW5zaWdodGZ1bCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZWxlbWVudHMgdGhhdCBsZWFkIHRvIHRoZSBwb3B1bGFyaXR5IG9mIEJpbGxib2FyZCBzdW1tZXIgc3VjY2Vzc2VzLgoKIyBHbG9zc2FyeQoKRGFuY2VhYmlsaXR5OiBBIG1lYXN1cmUgb2YgaG93IHN1aXRhYmxlIGEgdHJhY2sgaXMgZm9yIGRhbmNpbmcgYmFzZWQgb24gZmFjdG9ycyBsaWtlIHRlbXBvLCByaHl0aG0gc3RhYmlsaXR5LCBiZWF0IHN0cmVuZ3RoLCBhbmQgb3ZlcmFsbCByZWd1bGFyaXR5LgoKRW5lcmd5OiBSZXByZXNlbnRzIHRoZSBpbnRlbnNpdHkgYW5kIGFjdGl2aXR5IGxldmVsIG9mIGEgc29uZy4gSGlnaCBlbmVyZ3kgc29uZ3MgbWlnaHQgYmUgbW9yZSBsaXZlbHkgYW5kIGR5bmFtaWMsIHdoaWxlIGxvdyBlbmVyZ3kgc29uZ3MgbWF5IGJlIG1vcmUgY2FsbSBhbmQgc3ViZHVlZC4KCktleTogSW5kaWNhdGVzIHRoZSBrZXkgc2lnbmF0dXJlIG9mIHRoZSBzb25nLCByZXByZXNlbnRpbmcgdGhlIHRvbmFsIGNlbnRlciBvciBob21lIGJhc2Ugb2YgdGhlIG11c2ljLgoKTG91ZG5lc3M6IFJlZmVycyB0byB0aGUgdm9sdW1lIG9mIHRoZSBzb25nLiBJdCdzIHVzdWFsbHkgbWVhc3VyZWQgaW4gZGVjaWJlbHMgKGRCKS4gSGlnaGVyIHZhbHVlcyBpbmRpY2F0ZSBsb3VkZXIgc29uZ3MuCgpNb2RlOiBEZXNjcmliZXMgdGhlIG1vZGFsaXR5IG9mIHRoZSBtdXNpYywgaS5lLiwgd2hldGhlciBpdCdzIGluIGEgbWFqb3Igb3IgbWlub3Iga2V5LiBNYWpvciBrZXlzIG9mdGVuIHNvdW5kIG1vcmUgdXBsaWZ0aW5nLCB3aGlsZSBtaW5vciBrZXlzIGNhbiBnaXZlIGEgbW9yZSBtZWxhbmNob2xpYyBmZWVsLgoKU3BlZWNoaW5lc3M6IE1lYXN1cmVzIHRoZSBwcmVzZW5jZSBvZiBzcG9rZW4gd29yZHMgaW4gYSB0cmFjay4gU29uZ3Mgd2l0aCBoaWdoZXIgc3BlZWNoaW5lc3MgdmFsdWVzIG1heSBjb250YWluIG1vcmUgc3Bva2VuIHdvcmRzIHRoYW4gc2luZ2luZy4KCkFjb3VzdGljbmVzczogSW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIHRoYXQgYSB0cmFjayBpcyBhY291c3RpYywgbWVhbmluZyBpdCBkb2Vzbid0IGhlYXZpbHkgcmVseSBvbiBlbGVjdHJvbmljIG9yIHN5bnRoZXNpemVkIGVsZW1lbnRzLgoKSW5zdHJ1bWVudGFsbmVzczogTWVhc3VyZXMgdGhlIGxpa2VsaWhvb2QgdGhhdCBhIHRyYWNrIGlzIGluc3RydW1lbnRhbCwgd2l0aG91dCB2b2NhbCBjb250ZW50LgoKTGl2ZW5lc3M6IEluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2YgYW4gYXVkaWVuY2UgaW4gdGhlIHJlY29yZGluZy4gQSBoaWdoZXIgdmFsdWUgc3VnZ2VzdHMgdGhlIHRyYWNrIHdhcyBsaWtlbHkgcmVjb3JkZWQgbGl2ZS4KClZhbGVuY2U6IERlc2NyaWJlcyB0aGUgbXVzaWNhbCBwb3NpdGl2ZW5lc3Mgb2YgYSB0cmFjay4gSGlnaGVyIHZhbGVuY2UgdmFsdWVzIHN1Z2dlc3QgYSBtb3JlIHBvc2l0aXZlLCBoYXBweSwgb3IgY2hlZXJmdWwgbW9vZC4KClRlbXBvOiBSZXByZXNlbnRzIHRoZSBzcGVlZCBvciBwYWNlIG9mIGEgc29uZywgdHlwaWNhbGx5IG1lYXN1cmVkIGluIGJlYXRzIHBlciBtaW51dGUgKEJQTSkuCgpEdXJhdGlvbl9tczogVGhlIGR1cmF0aW9uIG9mIHRoZSBzb25nIGluIG1pbGxpc2Vjb25kcy4KClRpbWUgU2lnbmF0dXJlOiBEZXNjcmliZXMgdGhlIG51bWJlciBvZiBiZWF0cyBpbiBhIGJhciBhbmQgd2hpY2ggbm90ZSB2YWx1ZSBnZXRzIHRoZSBiZWF0LgoKS2V5IE1vZGU6IEEgY29tYmluYXRpb24gb2Yga2V5IGFuZCBtb2RlLCBpbmRpY2F0aW5nIGJvdGggdGhlIHRvbmFsIGNlbnRlciBhbmQgdGhlIG1vZGFsaXR5IG9mIHRoZSBtdXNpYy4=